from django.shortcuts import render

# Create your views here.
from rest_framework.views import APIView
from mall import settings
from urllib.parse import urlencode,parse_qs
from urllib.request import urlopen
from rest_framework.response import Response
from rest_framework import status
from rest_framework_jwt.settings import api_settings
from oauth.models import OAuthQQUser
from .utils import QQOauthTool
from .serializers import QQTokenSerializer

# Create your views here.
# 生成qq登录界面的url，让前端访问该url
class QQAuthURLView(APIView):
    """
    实现出现QQ授权登录视图
    GET /oauth/qq/statues/
    """

    def get(self,request):

        # 生成auth_url
        # https://graph.qq.com/oauth2.0/authorize
        # 请求参数请包含如下内容：
        # response_type   必须      授权类型，此值固定为“code”。
        # client_id       必须      申请QQ登录成功后，分配给应用的appid。
        # redirect_uri    必须      成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
        # state           必须      client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
        # scope              可选      scope=get_user_info

        #获取state
        # state = request.query_params.get('state')
        # #设置base_url,注意添加 ?
        # base_url = 'https://graph.qq.com/oauth2.0/authorize?'
        # #组织参数
        # params = {
        #     'response_type':'code',
        #     'client_id':settings.QQ_APP_ID,
        #     'redirect_uri':settings.QQ_REDIRECT_URL,
        #     'state':state,
        #     'scope':'get_user_info',
        # }
        #
        # #对参数进行urlencode,然后拼接url
        # auth_url = base_url + urlencode(params)
        #
        # #返回响应
        # return Response({'auth_url':auth_url})
        qq = QQOauthTool()
        url_response = qq.get_oauth_url(request)

        return url_response


# 用户通过扫描二维码，获取code,code换取token,token换取openid,将openid加密,通过判断openid是否存在
# openid存在，则返回登录的token即可，如果不存在，则返回注册页面，进行绑定用户
from rest_framework.generics import GenericAPIView
class QQTokenView(GenericAPIView):

    """
    GET /oauth/qq/?code=xxxxx
    我们通过获取的 code 来换取token

    """
    serializer_class = QQTokenSerializer
    def get(self,request):

        """
        # PC网站：https://graph.qq.com/oauth2.0/token
        # GET
        # grant_type      必须      授权类型，在本步骤中，此值为“authorization_code”。
        # client_id       必须      申请QQ登录成功后，分配给网站的appid。
        # client_secret   必须      申请QQ登录成功后，分配给网站的appkey。
        # code            必须      上一步返回的authorization
        # redirect_uri    必须      与上面一步中传入的redirect_uri保持一致。
        """
        #
        # code = request.query_params.get('code')
        #
        # if code is None:
        #     return Response(status=status.HTTP_400_BAD_REQUEST)
        #
        # # #注意添加 ?
        # base_url = 'https://graph.qq.com/oauth2.0/token?'
        #
        # params = {
        #     'grant_type':'authorization_code',
        #     'client_id':settings.QQ_APP_ID,
        #     'client_secret':settings.QQ_APP_KEY,
        #     'code':code,
        #     'redirect_uri':settings.QQ_REDIRECT_URL
        # }
        #
        #
        # url = base_url + urlencode(params)
        #
        #
        # # 我们自己去请求来获取数据
        # #通过urlopen来请求url中数据
        # response = urlopen(url)
        #
        # data = response.read().decode()
        # # parse_qs将获取的参数转换为字典
        # dict = parse_qs(data)
        #
        # access_tokens = dict.get('access_token')
        #
        # if access_tokens:
        #     access_token = access_tokens[0]
        #
        # # 'access_token=C7299EDD52B07DC8B0B3DFF767909803&
        # # expires_in=7776000&
        # # refresh_token=CBCAC05971E8769268AC3DCFA5B72F6B'
        # print(access_token)
        # pass
        qq = QQOauthTool()

        token = qq.get_token_by_code(request)

        print(token, 'miaomiao')

        openid = qq.get_openid_by_token(token)

        if openid is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)

            # openid 获取到了

            # 根据openid 来判断用户之前是否绑定过
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 没有绑定过
            # 需要绑定
            # 第一次登录
            token = OAuthQQUser.generic_token_by_openid(openid)

            return Response({"access_token": token})

        else:
            # else 什么时候执行,没有异常的时候
            # 绑定过, 让它直接登录
            # 查询用户,生成登录token
            # 不是第一次登录
            user = qquser.user
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)

            response = Response({
                'token': token,
                'user_id': user.id,
                'username': user.username
            })
            return response



    def post(self,request):

        # 1.创建序列化器
        serializer = self.get_serializer(data=request.data)

        # 2.校验数据
        serializer.is_valid(raise_exception=True)

        # 3.保存数据
        user = serializer.save()

        # 4.生成已登录的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)

        # 5.返回token,use_id,usename
        response = Response({
            'token': token,
            'user_id': user.id,
            'user_name': user.username
        })

        return response
